package cn.itsource.ymcc.service.impl;

import cn.itsource.result.JSONResult;
import cn.itsource.util.AssertUtil;
import cn.itsource.ymcc.constant.BaseConstants;
import cn.itsource.ymcc.domain.CourseType;
import cn.itsource.ymcc.mapper.CourseTypeMapper;
import cn.itsource.ymcc.service.ICourseTypeService;
import cn.itsource.ymcc.vo.CrumbVo;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 * 用户登录名称 163.aliyun.com@1678753499785898.onaliyun.com
 * AccessKey ID LTAI5tNDa8Hkg5s9e1bZfovf
 * AccessKey Secret uDpfTaT8emTveM29TC0iRzkabtSjEE
 *
 * @author Cherish
 * @since 2022-08-07
 */
@Service
@Slf4j
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {

    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;


    @Override
    @CacheEvict(cacheNames = BaseConstants.TreeConstant.TREE_KEY,key = "'ALL'")
    public boolean insert(CourseType entity) {
        return super.insert(entity);
    }
    @Override
    @CacheEvict(cacheNames = BaseConstants.TreeConstant.TREE_KEY,key = "'ALL'")
    public boolean deleteById(Serializable id) {
        return super.deleteById(id);
    }
    @Override
    @CacheEvict(cacheNames = BaseConstants.TreeConstant.TREE_KEY,key = "'ALL'")
    public boolean updateById(CourseType entity) {
        return super.updateById(entity);
    }

    @Override
    @Cacheable(cacheNames = BaseConstants.TreeConstant.TREE_KEY,key = "'ALL'")
    public JSONResult treeData() {
//        log.info("查询redis");
//        Object treeTmp = redisTemplate.opsForValue().get(BaseConstants.TreeConstant.TREE_KEY);
//        if (treeTmp == null){
//            log.info("查询数据库");
//            treeTmp = list2Tree();
//            redisTemplate.opsForValue().set(BaseConstants.TreeConstant.TREE_KEY,treeTmp);
//        }
//
//        return JSONResult.success(treeTmp);
        List<CourseType> courseTypes = list2Tree();
        return JSONResult.success(courseTypes);
    }

    /**
     * 实现步骤：
     * 1.根据courseTypeId，查询出CourseType，得到path
     * 2.根据"\\."分割path，得到所有的面包屑的ID
     * 3.遍历每个ID，查询CourseType 封装成 me
     * 4.在根据me的pid查询所有和我评级的CourseType，封装成others
     * 5.把me和others搞成一个Vo对象返回给前端即可
     * @param id
     * @return
     */

    @Override
    public List<CrumbVo> getCrumbs(Long id) {
        // 参数校验
        AssertUtil.isNotNull(id,"id不能为空！");
        // 通过id找到对应的type数据
        CourseType courseType = selectById(id);
        String path = courseType.getPath();
        String[] splitPath = path.split("\\.");
        // 批量查询数据
        List<CourseType> courseTypes = selectBatchIds(Arrays.asList(splitPath));
        // 将得到的数据封装成vo对象的集合返回
        List<CrumbVo> result =  new ArrayList();
        for (CourseType type : courseTypes) {
            CrumbVo crumbVo = new CrumbVo();
            crumbVo.setMyCourseType(type);
            Long pid = type.getPid();
            Wrapper<CourseType> wrapper = new EntityWrapper<>();
            wrapper.eq("pid", pid);
            List<CourseType> others = selectList(wrapper);
            others.remove(type);
            crumbVo.setOtherCourseTypes(others);
            result.add(crumbVo);
        }
        return result;

    }

    public List<CourseType> list2Tree() {
        //查询所有分类
        List<CourseType> allCourseType = selectList(null);
        //把所有分类存储到一个hashmap中
        HashMap<Long,CourseType> allCourseTypeMaps = new HashMap<>(allCourseType.size());
        for(CourseType courseType : allCourseType){
            allCourseTypeMaps.put(courseType.getId(), courseType);
        }

        //装一级分类
        List<CourseType> firstCourseType = new ArrayList<>();
        for (CourseType courseType : allCourseType) {

            //查找一级分类
            if(courseType.getPid() == null || courseType.getPid().longValue() == 0){
                firstCourseType.add(courseType);
            }else{
                CourseType parentType = allCourseTypeMaps.get(courseType.getPid());
                if(parentType != null){
                    parentType.getChildren().add(courseType);
                }
            }
        }

        return firstCourseType;
    }

}
